home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / xshp15.zip / APPROT.C < prev    next >
Text File  |  1991-12-26  |  4KB  |  94 lines

  1. /* Routines to perform incremental rotations around the three axes. */
  2. #include <math.h>
  3. #include "polygon.h"
  4.  
  5. /* Concatenate a rotation by Angle around the X axis to the
  6.    transformation in XformToChange, placing the result back into
  7.    XformToChange. */
  8. void AppendRotationX(Xform XformToChange, TAngle Angle)
  9. {
  10.    Fixedpoint CosTemp, SinTemp;
  11.    Fixedpoint Temp10, Temp11, Temp12, Temp20, Temp21, Temp22;
  12.  
  13.     /* Get the sine and cosine of the rotation angle */
  14.     CosSin(Angle, &CosTemp, &SinTemp);
  15.  
  16.    /* Calculate the new values of the six affected matrix entries */
  17.    Temp10 = FixedMul(CosTemp, XformToChange[1][0]) +
  18.          FixedMul(-SinTemp, XformToChange[2][0]);
  19.    Temp11 = FixedMul(CosTemp, XformToChange[1][1]) +
  20.          FixedMul(-SinTemp, XformToChange[2][1]);
  21.    Temp12 = FixedMul(CosTemp, XformToChange[1][2]) +
  22.          FixedMul(-SinTemp, XformToChange[2][2]);
  23.    Temp20 = FixedMul(SinTemp, XformToChange[1][0]) +
  24.          FixedMul(CosTemp, XformToChange[2][0]);
  25.    Temp21 = FixedMul(SinTemp, XformToChange[1][1]) +
  26.          FixedMul(CosTemp, XformToChange[2][1]);
  27.    Temp22 = FixedMul(SinTemp, XformToChange[1][2]) +
  28.          FixedMul(CosTemp, XformToChange[2][2]);
  29.    /* Put the results back into XformToChange */
  30.    XformToChange[1][0] = Temp10; XformToChange[1][1] = Temp11;
  31.    XformToChange[1][2] = Temp12; XformToChange[2][0] = Temp20; 
  32.    XformToChange[2][1] = Temp21; XformToChange[2][2] = Temp22;
  33. }
  34.  
  35. /* Concatenate a rotation by Angle around the Y axis to the
  36.    transformation in XformToChange, placing the result back into
  37.    XformToChange. */
  38. void AppendRotationY(Xform XformToChange, TAngle Angle)
  39. {
  40.    Fixedpoint CosTemp, SinTemp;
  41.    Fixedpoint Temp00, Temp01, Temp02, Temp20, Temp21, Temp22;
  42.  
  43.     /* Get the sine and cosine of the rotation angle */
  44.     CosSin(Angle, &CosTemp, &SinTemp);
  45.  
  46.    /* Calculate the new values of the six affected matrix entries */
  47.    Temp00 = FixedMul(CosTemp, XformToChange[0][0]) +
  48.          FixedMul(SinTemp, XformToChange[2][0]);
  49.    Temp01 = FixedMul(CosTemp, XformToChange[0][1]) +
  50.          FixedMul(SinTemp, XformToChange[2][1]);
  51.    Temp02 = FixedMul(CosTemp, XformToChange[0][2]) +
  52.          FixedMul(SinTemp, XformToChange[2][2]);
  53.    Temp20 = FixedMul(-SinTemp, XformToChange[0][0]) +
  54.          FixedMul( CosTemp, XformToChange[2][0]);
  55.    Temp21 = FixedMul(-SinTemp, XformToChange[0][1]) +
  56.          FixedMul(CosTemp, XformToChange[2][1]);
  57.    Temp22 = FixedMul(-SinTemp, XformToChange[0][2]) +
  58.          FixedMul(CosTemp, XformToChange[2][2]);
  59.    /* Put the results back into XformToChange */
  60.    XformToChange[0][0] = Temp00; XformToChange[0][1] = Temp01;
  61.    XformToChange[0][2] = Temp02; XformToChange[2][0] = Temp20;
  62.    XformToChange[2][1] = Temp21; XformToChange[2][2] = Temp22;
  63. }
  64.  
  65. /* Concatenate a rotation by Angle around the Z axis to the
  66.    transformation in XformToChange, placing the result back into
  67.    XformToChange. */
  68. void AppendRotationZ(Xform XformToChange, TAngle Angle)
  69. {
  70.    Fixedpoint CosTemp, SinTemp;
  71.    Fixedpoint Temp00, Temp01, Temp02, Temp10, Temp11, Temp12;
  72.  
  73.     /* Get the sine and cosine of the rotation angle */
  74.     CosSin(Angle, &CosTemp, &SinTemp);
  75.  
  76.    /* Calculate the new values of the six affected matrix entries */
  77.    Temp00 = FixedMul(CosTemp, XformToChange[0][0]) +
  78.          FixedMul(-SinTemp, XformToChange[1][0]);
  79.    Temp01 = FixedMul(CosTemp, XformToChange[0][1]) +
  80.          FixedMul(-SinTemp, XformToChange[1][1]);
  81.    Temp02 = FixedMul(CosTemp, XformToChange[0][2]) +
  82.          FixedMul(-SinTemp, XformToChange[1][2]);
  83.    Temp10 = FixedMul(SinTemp, XformToChange[0][0]) +
  84.          FixedMul(CosTemp, XformToChange[1][0]);
  85.    Temp11 = FixedMul(SinTemp, XformToChange[0][1]) +
  86.          FixedMul(CosTemp, XformToChange[1][1]);
  87.    Temp12 = FixedMul(SinTemp, XformToChange[0][2]) +
  88.          FixedMul(CosTemp, XformToChange[1][2]);
  89.    /* Put the results back into XformToChange */
  90.    XformToChange[0][0] = Temp00; XformToChange[0][1] = Temp01;
  91.    XformToChange[0][2] = Temp02; XformToChange[1][0] = Temp10;
  92.    XformToChange[1][1] = Temp11; XformToChange[1][2] = Temp12;
  93. }
  94.